//
// Created by F1997 on 2024/10/24.
//

#include "PduUtils.h"

// 参考
// https://blog.csdn.net/qq_43680827/article/details/140274996
bool PduUtils::callback(const Tins::PDU &pdu) {
    // 解析 ip 层 PDU
    const Tins::IP &ip = pdu.rfind_pdu<Tins::IP>();
    // 解析 tcp 层 PDU
    const Tins::TCP &tcp = pdu.rfind_pdu<Tins::TCP>();
    // 解析 udp 层 PDU
    const Tins::UDP &udp = pdu.rfind_pdu<Tins::UDP>();

    // 按源/目地端口号过滤
/*    if (udp.sport() == 5784 || udp.dport() == 5784) {
        // 尝试用 DNS 解析
        Tins::DNS dns = pdu.rfind_pdu<Tins::RawPDU>().to<Tins::DNS>();
        // 打印出查询到的域名
        for (const auto &query: dns.queries()) {
            std::cout << query.dname() << std::endl;
        }
    }*/

    std::cout << ip.src_addr() << ':'<< tcp.sport()
    << " -> " << ip.dst_addr() << ':' << tcp.dport()
    //<< " udp: " << udp.sport() << ":" << udp.dport()
    << std::endl;


    return true;
}


void PduUtils::sniff(const std::string &interface) {
    Tins::SnifferConfiguration config;
    Tins::Sniffer("ens33").sniff_loop(callback);
}


void PduUtils::utilMain() {
    Tins::Sniffer("ens33").sniff_loop(PduUtils::callback);

}
